---
title: SAIF.Business.Tasks.Claim business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF Documentation
last_reviewed: 2026-08-21
library: SAIF.Business.Tasks.Claim
reference_type: embedded
---

# SAIF.Business.Tasks.Claim business rules

This page captures business rules enforced by this library.

## BR-CT-01 Claim task must reference a resolvable claim

| Field | Value |
| --- | --- |
| **Statement** | A claim task must reference a resolvable claim (`ClaimID <> 0`). |
| **Trigger** | `ClaimNum` assignment (`CheckRules("ClaimNum")`) and rule validation before save |
| **Enforcement** | `clsClaimTask.ValidClaimNum` |
| **Outcome** | Fails at `RuleCheckLevel.LevelOne` with "Error: Claim Number is invalid." |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-02 Task due date cannot be more than two years in the future

| Field | Value |
| --- | --- |
| **Statement** | A task due date may not be more than two years in the future (the sentinel `Date.MaxValue` is exempt). |
| **Trigger** | Rule check on `TaskDate`; skipped when the task is deleted or not dirty |
| **Enforcement** | `clsClaimTask.FutureDateWarning` |
| **Outcome** | Fails at LevelOne with "Error: Task date is over 2 years in the future." |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-03 Assignee must hold task-update AD access

| Field | Value |
| --- | --- |
| **Statement** | The assignee mailid must hold AD resource `CTTaskUpdate`, or else external resource `RTWExternalUpdate`. |
| **Trigger** | `MailID` assignment (`CheckRules("TaskUser")`) while `mailidNeedsValidation` is set and the task is dirty and not deleted |
| **Enforcement** | `clsClaimTask.ValidMailId`, via `ObjectServices.HasResourceAccess` / `HasResourceAccessExternal` |
| **Outcome** | Fails at LevelTwo with "Error: MailID [x] does not have access to RTWExternalUpdate"; if only external access is held, [BR-CT-06](#br-ct-06-external-rtw-user-must-be-assigned-to-the-claim) is registered and validation continues |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-03a Assignee validation exemptions

| Field | Value |
| --- | --- |
| **Statement** | Validation of the assignee is skipped for informational messages (`PriorityCode = MailID`), for the current user (`MailID = DataPortalInfo.UserID`), and for `TEST`-prefixed accounts matching the mailid after the `TEST` prefix. |
| **Trigger** | Same as [BR-CT-03](#br-ct-03-assignee-must-hold-task-update-ad-access) |
| **Enforcement** | `clsClaimTask.ValidMailId` |
| **Outcome** | Rule passes without a resource lookup |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-04 Task text is required

| Field | Value |
| --- | --- |
| **Statement** | Task text is required, except for informational messages (`PriorityCode = MailID`). |
| **Trigger** | Rule check on `Text` |
| **Enforcement** | `clsClaimTask.ValidText` |
| **Outcome** | Fails at LevelOne with "Error: Text required." |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-05 Task text length limit

| Field | Value |
| --- | --- |
| **Statement** | Task text may not exceed 4,000 characters. |
| **Trigger** | Rule check on `Text` |
| **Enforcement** | `clsClaimTask.ValidTextLength` |
| **Outcome** | Fails at LevelOne with "Error: Text limited to 4000 characters." |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-06 External RTW user must be assigned to the claim

| Field | Value |
| --- | --- |
| **Statement** | An external return-to-work user may only be assigned a task on a claim they are assigned to. |
| **Trigger** | Registered dynamically by [BR-CT-03](#br-ct-03-assignee-must-hold-task-update-ad-access) when the assignee holds only `RTWExternalUpdate` |
| **Enforcement** | `clsClaimTask.RTWAssignedClaim` → `clsClaimSecurity.RTWAssignedToClaim(dpi, ClaimID, MailID)` |
| **Outcome** | Rule failure blocks assignment when the external user is not assigned to the claim* |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-07 Completing a notepad-required task marks it completed before soft delete

| Field | Value |
| --- | --- |
| **Statement** | Completing a task that requires a notepad entry flags it as completed before the soft delete, so a notepad entry can be generated. |
| **Trigger** | `MarkCompleted()` when `NotepadFlag = "Y"` |
| **Enforcement** | `clsClaimTask.MarkCompleted` |
| **Outcome** | `Completed = True`, `DeleteFlag = "Y"`, task marked dirty |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-08 Task text is sanitized on assignment

| Field | Value |
| --- | --- |
| **Statement** | Task text is sanitized on assignment; only non-empty text that differs from the current value is accepted. |
| **Trigger** | `Text` property setter |
| **Enforcement** | `clsClaimTask.Text` setter via `clsCharacterAnalyzer.GetCleanString` |
| **Outcome** | Cleaned text stored, task marked dirty, `CheckRules("Text")` run; otherwise assignment ignored |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-09 Priority-task flag maps to URGMED priority code

| Field | Value |
| --- | --- |
| **Statement** | A task flagged as a priority task carries priority code `URG`; clearing the flag sets `MED`. |
| **Trigger** | `PriorityTask` property setter |
| **Enforcement** | `clsClaimTask.PriorityTask` setter |
| **Outcome** | Priority code changed and task marked dirty; other codes are overwritten* |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-CT-10 Claim tasks default to the Manage Claims category

| Field | Value |
| --- | --- |
| **Statement** | Claim tasks are always created under the Manage Claims category (`CLMM`) unless the caller requests Fast Track (`FSTRK`). |
| **Trigger** | `clsClaimTask.NewTask` factory / generator task creation |
| **Enforcement** | `clsClaimTask.NewTask` and `clsClaimTaskGenerator.NewTask` |
| **Outcome** | `CategoryCode` set to `CLMM` or `FSTRK` |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb, SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb |

---

## BR-CT-11 Claim tasks always report Claims source system

| Field | Value |
| --- | --- |
| **Statement** | Claim tasks always report source system `Claims` / source code `CLAIM` and never require an action code. |
| **Trigger** | Every retrieval and save |
| **Enforcement** | `clsClaimTask.SourceSystem`, `SourceCode`, `ActionCode` |
| **Outcome** | Retrieval criteria are constrained to `CLAIM` rows; action code is `NONE` |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTask.vb |

---

## BR-MY-01 Confidential worker name redaction

| Field | Value |
| --- | --- |
| **Statement** | The worker name on a task is hidden from users lacking the matching access right when the claim is flagged exposure, health issue, hostile worker, or worker conflict. |
| **Trigger** | Every "my tasks" retrieval, per row |
| **Enforcement** | `clsMyTaskCollection.AfterRetrieve` via `ClaimServices.HasExposureAccess` / `HasCollateralAccess` / `HasSecureAccess` / `HasConflictAccess` |
| **Outcome** | `WorkerName` replaced with the literal `"Confidential"` |
| **SQL** | [SQL-001](sql/SQL-001-select-additional-fields.md) |
| **Source** | SAIF.Business.Tasks.Claim/clsMyTaskCollection.vb |

---

## BR-MY-02 Urgent claims grouped ahead in my tasks sort

| Field | Value |
| --- | --- |
| **Statement** | Tasks are listed with all tasks of a claim that has an urgent task grouped ahead of the remainder, then by due date and claim number. |
| **Trigger** | Row add and post-retrieval sort |
| **Enforcement** | `clsMyTaskCollection.setSortOrder` / `SortByDefault` |
| **Outcome** | `sortBy` key assigned, multi-key sort applied |
| **Source** | SAIF.Business.Tasks.Claim/clsMyTaskCollection.vb |

---

## BR-MY-03 Unsupported task source system cannot be loaded

| Field | Value |
| --- | --- |
| **Statement** | A task whose source code has no supported concrete type cannot be loaded. |
| **Trigger** | `AfterRetrieve` when `NewTask()` returns `Nothing` |
| **Enforcement** | `clsMyTaskCollection.AfterRetrieve` |
| **Outcome** | `ApplicationException` "<source> Tasks are not yet supported!" |
| **Source** | SAIF.Business.Tasks.Claim/clsMyTaskCollection.vb |

---

## BR-CB-01 Coverage B task must reference a valid Coverage B claim

| Field | Value |
| --- | --- |
| **Statement** | A Coverage B task must reference a valid claim whose coverage code is `B`; deleted tasks are exempt. |
| **Trigger** | `ClaimNum` assignment (`CheckRules("ClaimNum")`) and validation before save |
| **Enforcement** | `clsCoverageBTask.ValidClaimNum` |
| **Outcome** | Fails at LevelOne with "Error: Please enter a valid claim number." or "Error: Claim number is not a Coverage B Claim." |
| **Source** | SAIF.Business.Tasks.Claim/clsCoverageBTask.vb |

---

## BR-CB-02 Coverage B task text is required

| Field | Value |
| --- | --- |
| **Statement** | Coverage B task text is required. |
| **Trigger** | Rule check on `Text` |
| **Enforcement** | `clsCoverageBTask.AddBusinessRules` → `CommonBusinessRules.TextRequired` |
| **Outcome** | Fails with "Error: Text required." |
| **Source** | SAIF.Business.Tasks.Claim/clsCoverageBTask.vb |

---

## BR-CB-03 Coverage B due date window is one year

| Field | Value |
| --- | --- |
| **Statement** | A Coverage B due date must fall between today and one year from today. |
| **Trigger** | Base rule `TASK2` evaluation when the task is dirty and not deleted |
| **Enforcement** | `clsCoverageBTask.OverrideRules` |
| **Outcome** | Base result overridden to fail with "Error: Due date must be between today and one year from today." |
| **Source** | SAIF.Business.Tasks.Claim/clsCoverageBTask.vb |

---

## BR-CB-04 Coverage B tasks always report Coverage B source system

| Field | Value |
| --- | --- |
| **Statement** | Coverage B tasks always report source system `CoverageB` / source code `COVB`, never require a notepad entry, and require no action code. |
| **Trigger** | Every retrieval and save |
| **Enforcement** | `clsCoverageBTask.SourceSystem`, `SourceCode`, `RequiresNotePadEntry`, `ActionCode` |
| **Outcome** | Retrieval constrained to `COVB` rows; notepad never required |
| **Source** | SAIF.Business.Tasks.Claim/clsCoverageBTask.vb |

---

## BR-CB-05 Coverage B due date rolls to next working day

| Field | Value |
| --- | --- |
| **Statement** | A Coverage B due date that falls on a non-working day is rolled to the next working day. |
| **Trigger** | Task construction (`TaskDateModifier = NextWorkDay`) |
| **Enforcement** | `clsCoverageBTask.New`, applied by the base date logic |
| **Outcome** | Stored due date is a working day |
| **Source** | SAIF.Business.Tasks.Claim/clsCoverageBTask.vb |

---

## BR-GEN-01 Generated task must specify a claim

| Field | Value |
| --- | --- |
| **Statement** | A generated task must specify a claim. |
| **Trigger** | `clsClaimTaskGenerator` private `NewTask` when `inClaimID = 0` |
| **Enforcement** | `clsClaimTaskGenerator.NewTask` |
| **Outcome** | `ApplicationException("ClaimID not specified")` — creation aborts |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb |

---

## BR-GEN-02 Generated task due date normalized to a working day

| Field | Value |
| --- | --- |
| **Statement** | A generated task's due date is normalized to a working day: same-day requests use the next working day; explicit dates on non-working days roll forward; offsets roll back to the previous working day. |
| **Trigger** | Every `AddTask` overload |
| **Enforcement** | `clsClaimTaskGenerator.AddTask` overloads via `clsSmartDate.NextWorkDay` / `IsWorkingDay` |
| **Outcome** | Due date replaced with a working day before task creation |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb |

---

## BR-GEN-03 Default assignee is the responsible adjuster

| Field | Value |
| --- | --- |
| **Statement** | When no assignee is supplied, the task is assigned to the claim's responsible adjuster. |
| **Trigger** | Private `NewTask` when `inUser` is blank |
| **Enforcement** | `clsClaimTaskGenerator.NewTask` via `ClaimServices.GetResponsibleAdjuster` or `clsClaimData.AdjusterMailID` |
| **Outcome** | `MailID` set to the adjuster mailid, then validated by [BR-CT-03](#br-ct-03-assignee-must-hold-task-update-ad-access) |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb |

---

## BR-GEN-04 Default create user is the data-portal user

| Field | Value |
| --- | --- |
| **Statement** | The create user defaults to the current data-portal user when the caller does not supply one. |
| **Trigger** | Generator construction (`Initialize`) |
| **Enforcement** | `clsClaimTaskGenerator.Initialize` |
| **Outcome** | `m_CreateUser` = `IDataPortalInfo.UserID`; stamped on every generated task |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb |

---

## BR-GEN-05 Generated tasks claim must resolve to a valid claim record

| Field | Value |
| --- | --- |
| **Statement** | Each generated task's claim must resolve to a valid claim record. |
| **Trigger** | Rule added per task at generation; evaluated at validation/save |
| **Enforcement** | `clsClaimTaskGenerator.IsValidClaimID` via `clsClaimData.GetData(...).IsValid` |
| **Outcome** | Fails at LevelThree with "Invalid ClaimdID specified on Task" |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb |

---

## BR-GEN-06 Unrecognized priority values default silently

| Field | Value |
| --- | --- |
| **Statement** | An unrecognized priority enum maps to `INFO`; an unrecognized priority code maps to `Medium`. |
| **Trigger** | Priority conversion during task creation or display |
| **Enforcement** | `clsClaimTaskGenerator.GetPriorityText` overloads |
| **Outcome** | Defaulted priority applied silently |
| **Source** | SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb |

---

## BR-LTC-01 Legacy task codes are read-only

| Field | Value |
| --- | --- |
| **Statement** | Legacy task codes are read-only reference data — create, insert, update, and delete are not supported. |
| **Trigger** | Any attempt to read a non-retrieve SQL property |
| **Enforcement** | `clsLegacyTaskCode.Criteria` and `clsLegacyTaskCodeCollection.Criteria` |
| **Outcome** | `ApplicationException(clsConstants.Messages.InvalidSQLProperty)` |
| **SQL** | [SQL-002](sql/SQL-002-legacy-task-code-select.md) |
| **Source** | SAIF.Business.Tasks.Claim/clsLegacyTaskCode.vb, SAIF.Business.Tasks.Claim/clsLegacyTaskCodeCollection.vb |

## Notes

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts. Statements
> marked with ** could not be confirmed; treat as unknown until verified.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [Security and authorization](security-authorization.md)
- [API reference](api/index.md)

## Sources
- SAIF.Business.Tasks.Claim/clsClaimTask.vb
- SAIF.Business.Tasks.Claim/clsClaimTaskGenerator.vb
- SAIF.Business.Tasks.Claim/clsCoverageBTask.vb
- SAIF.Business.Tasks.Claim/clsMyTaskCollection.vb
- SAIF.Business.Tasks.Claim/clsLegacyTaskCode.vb
- SAIF.Business.Tasks.Claim/clsLegacyTaskCodeCollection.vb
